<template>
  <div id="app">
    <!-- 搜索栏 -->
    <van-nav-bar
      title="搜索中心"
      left-arrow
      @click-left="$router.back()"
    ></van-nav-bar>
    <form action="/">
      <van-search
        v-model.trim="value"
        shape="round"
        show-action
        @input="onInput"
        placeholder="请输入搜索关键词"
        @search="onSearch"
        clearable
      >
        <template #action>
          <div @click="onSearch" style="color: #3196fa">搜索</div>
        </template>
      </van-search>
    </form>
    <!-- 搜索记录 -->
    <van-cell-group v-if="!value">
      <van-cell title="历史记录"></van-cell>
      <van-cell
        icon="search"
        v-for="(item, index) in historyList"
        :key="index"
        :title="item"
      ></van-cell>
    </van-cell-group>
    <!-- 搜索内容模糊匹配 -->
    <van-cell-group v-else>
      <van-cell icon="search" v-for="(item, index) in suggestCol" :key="index">
        <div v-html="item"></div>
      </van-cell>
    </van-cell-group>
  </div>
</template>

<script>
import { searchAPI } from "@/api/index.js";
// import { Toast } from "vant";
export default {
  data () {
    return {
      value: '',
      list: [],
      timerId: '',
      historyList: JSON.parse(localStorage.getItem('history')) || [] // 保存搜索记录的数组
    }
  },
  methods: {
    // 搜索的点击事件
    onSearch () {
      if (this.value) {
        // 判断本次搜索记录是否与数组里的数据相同，相同就不保存到数组
        if (!this.historyList.includes(this.value)) {
          localStorage.setItem('history', JSON.stringify(this.historyList))
        }
      }
    },
    // 点击时发起请求获得联想匹配的数据
    onInput () {
      // 如果短时间内频繁触发，那么每次触发前就清除上一次触发的计时器
      clearTimeout(this.timerId)
      // 当我们在短时间内输入多个内容时，会不间断的发起请求，这样会浪费性能
      // 所以可以用防抖进行优化
      this.timerId = setTimeout(async () => {
        if (this.value) {
          let res = await searchAPI({
            q: this.value
          })
          console.log(res)
          this.list = res.data.data.options
        }
      }, 400)
    }
  },
  // 使用计算属性让搜索关键字高亮
  computed: {
    suggestCol () {
      // 遍历搜索到的联想数组，产生一个新数组
      let reg = new RegExp(this.key, 'ig')
      return this.list.map(v =>
        v.replace(reg, `<span style="color:red;">${this.value}</span>`)
      )
    }
  }
}
</script>
<style scoped lang="less"></style>